package com.cool.shark.service;

import com.cool.shark.pojo.dto.GoodsDeleteDto;
import com.cool.shark.pojo.dto.GoodsDto;
import com.cool.shark.pojo.dto.GoodsStandardDto;
import com.cool.shark.pojo.vo.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * @Name: GoodsService
 * @Author: 西风残叶
 * @Date: 2024/4/17 20:37
 * @Version: 1.0
 * @TODO: 商品业务
 */
@Transactional
public interface GoodsService {
    /**
     * 插入商品信息
     *
     * @param goods 商品数据传输对象，包含商品的详细信息
     */
    void insert(GoodsDto goods);

    /**
     * 列出所有商品信息
     * 本方法不接受参数，调用后会返回商品列表。
     */
    List<GoodsVo> list();
    List<GoodsVo> listAll();

    /**
     * 使某个对象启用。
     *
     * @param spuId 对象的唯一标识符。
     */
    void setEnable(Long spuId);

    /**
     * 使某个对象禁用。
     *
     * @param spuId 对象的唯一标识符。
     */
    void setDisable(Long spuId);

    /**
     * 上传商品图片
     *
     * @param multipartFile 多部分文件，代表要上传的图片
     * @return 返回上传成功后的图片URL
     */
    String uploadGoodsImg(MultipartFile multipartFile) throws IOException;

    /**
     * 删除商品相关信息。
     *
     * @param spuId 包含商品删除信息的DTO（数据传输对象），具体包括需要删除的商品ID等信息。
     */
    void delete(Long spuId);

    /**
     * 根据SPU ID获取商品信息。
     *
     * @param spuId 商品的SPU（Standard Product Unit）ID，用于标识唯一商品。
     * @return 返回对应SPU ID的商品信息VO（Value Object），包含商品的各种详细信息。
     */
    GoodsStandardVo getGoodsBySpuId(Long spuId);

    /**
     * 更新商品标准信息。
     *
     * @param goodsDto 商品标准数据传输对象，包含需要更新的商品标准信息。
     *                 通过此对象，可以更新商品的各个属性，例如名称、规格等。
     *                 注意：该方法不会返回任何值，更新操作的结果（例如成功或失败）应该通过其他方式（例如日志）进行跟踪。
     */
    void update(GoodsStandardDto goodsDto);

    /**
     * 获取商品详情信息
     *
     * @param id 商品的唯一标识符
     * @return 返回一个GoodsDetailVo对象，包含商品的详细信息
     */
    GoodsDetailVo getGoodsDetail(Long id);

    /**
     * 获取商品数量列表。
     *
     * <p>该方法不接受任何参数，返回一个包含商品数量信息的列表。
     * 列表中的每个元素都代表一个商品及其对应的数量。
     *
     * @return List<GoodsNumVo> - 商品数量列表。每个列表项都包含商品的详细信息和数量。
     */
    List<GoodsNumVo> getGoodsNum();

    /**
     * 根据关键字搜索商品信息。
     *
     * @param keyword 搜索关键字，用于匹配商品名称或描述。
     * @return 返回一个商品信息列表，包含与关键字匹配的商品。
     */
    List<GoodsVo> search(String keyword);

    /**
     * 获取商品销售情况的列表。
     *
     * <p>该方法不接受任何参数，返回一个包含商品销售信息的列表。
     * 列表中的每个元素都是GoodsSalesVO类型，代表一个商品的销售记录。
     *
     * @return List<GoodsSalesVO> 返回一个包含商品销售信息的列表。
     */
    List<GoodsSalesVO> sales();

    /**
     * 根据轮播图ID查询关联的商品列表。
     *
     * @param carouselId 轮播图的唯一标识符，用于查询与之关联的商品信息。
     * @return 返回一个商品信息列表，这些商品与指定的轮播图相关联。
     */
    List<GoodsResultVo> listByCarouselId(Long carouselId);
}
